package com.atguigu.juc.volatiles;

import java.util.concurrent.TimeUnit;

/**
 * @author yfstart
 * @create 2022-07-07 11:35
 */
public class VolatileSeeDemo {
  static volatile boolean flag = true;

  public static void main(String[] args) {
    new Thread(()->{
        System.out.println(Thread.currentThread().getName() + "\t ---come in");
        while (flag){

        }
        System.out.println(Thread.currentThread().getName() + "\t ---flag被设置为FALSE，程序停止");
    },"t1").start();
    
    try { TimeUnit.MILLISECONDS.sleep(2000); } catch (InterruptedException e) { e.printStackTrace();}

    flag = false;

    System.out.println(Thread.currentThread().getName() + "\t ---修改完成，flag值为：" + flag);
  }
  /** 使用：当读远多于写，结合使用内部锁和 volatile 变量来减少同步的开销
   * 理由：利用volatile保证读取操作的可见性；利用synchronized保证复合操作的原子性 */
  public class Counter {
    private volatile int value;

    public int getValue() {
      return value; // 利用volatile保证读取操作的可见性
    }

    public synchronized int increment() {
      return value++; // 利用synchronized保证复合操作的原子性
    }
  }
}
